package cn.hive.udaf;

import org.apache.hadoop.hive.ql.exec.UDAF;
import org.apache.hadoop.hive.ql.exec.UDAFEvaluator;

public class MyCountUDAF extends UDAF {

	public static class Evaluator implements UDAFEvaluator {

		// 用来记录count最后的数值
		private int count;

		// 构造方法,用来创建内部静态类的对象
		public Evaluator() {
			init();
		}

		// 用来初始化 count 的值
		@Override
		public void init() {
			count = 0;
		}

		/**
		 * 迭代器 -- Mapper:map()
		 * 
		 * 用来统计map阶段拿到的信息
		 * 
		 * @param input
		 * @return
		 */
		public boolean iterate(String input) {
			if (input == null) {
				return false;
			}
			count++;
			return true;
		}

		// Mapper -- combiner -- map output
		public int terminatePartial() {
			return count;
		}

		/**
		 * Reducer -- merge
		 * 
		 * reduce 阶段，用于逐个迭代处理map当中每个不同key对应的 terminatePartial的结果
		 * 
		 * @param mapOutput
		 * @return
		 */
		public boolean merge(int mapOutput) {
			count += mapOutput;
			return true;
		}

		/**
		 * Reducer -- out put
		 * 
		 * 处理merge计算完成后的结果，此时的count在merge完成时候，结果已经得出，无需再进一次对整体结果做处理，故直接返回即可
		 * 
		 * @return
		 */
		public int terminate() {
			return count;
		}
	}
}
